package edu.ccut.saturn.component;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * 数据库代理，维护了一个数据库连接对象，并提供了获得数据库连接对象、执行数据库连接的事务开始、事务提交、事务回滚操作的方法。
 * <p><li>字段connection：记录了每个数据库代理实例维护的数据库连接对象；
 * <li>字段bundleSymbolicName：记录了每个数据库代理对象对应的bundle的名称，每个数据库代理对象可以对应一个或0个bundle。
 * 
 * @author 谷钰
 * @author 温建
 *
 * @version 1.0 2008.9.03
 * 
 * @see DatabaseManager
 * 
 */
public class DatabaseBroker {

	private static final boolean TRANSACTION_JDBC_AUTOCOMMIT_FALSE = false;

	private Connection connection = null;

	private String bundleSymbolicName = null;

	public DatabaseBroker() {
	}

	/**
	 * 设置与数据库代理对象对应的bundle的名称
	 * 
	 * @param bundleName
	 */
	public void setBundleSysmbolicName(String bundleName) {
		this.bundleSymbolicName = bundleName;
	}

	/**
	 * 获得与数据库代理对象对应的bundle的名称
	 * 
	 * @return
	 */
	public String getBundleSysmbolicName() {
		return this.bundleSymbolicName;
	}

	/**
	 * 设置与数据库代理对象对应的bundle的名称
	 * 
	 * @param fullKey
	 */
	public void setBundleNameByFullKey(String fullKey) {
		int index = fullKey.indexOf("::");

		if (index > 0) {
			setBundleSysmbolicName(fullKey.substring(0, index));
		} 
	}

	/**
	 * 数据库连接的事务开始操作
	 * @throws SQLException 
	 */
	public void beginTransaction() throws SQLException {
		this.getConnection().setAutoCommit(TRANSACTION_JDBC_AUTOCOMMIT_FALSE);
	}

	/**
	 * 数据库连接的提交操作
	 * @throws SQLException 
	 */
	public void commitTransaction() throws SQLException {
		if (this.hasConnection()) {
			this.getConnection().commit();
		}
	}

	/**
	 * 数据库连接的回滚操作
	 * @throws SQLException 
	 */
	public void rollbackTracsaction() throws SQLException {
		if (this.hasConnection()) {
			this.getConnection().rollback();
		}
	}

	/**
	 * 获得公共的默认配置的数据库连接对象
	 * 
	 * @return
	 */
	public Connection getDefaultConnection() {
		synchronized (this) {

			if (this.connection == null) {
				this.connection = DatabaseManager.getInstance().getConnection();
			}
		}
		return this.connection;
	}

	/**
	 * 获得数据库连接对象。根据数据库代理记录的bundleSymbolicName，获得相应的bundle指定的数据库连接池信息生成的连接对象。
	 * 如果指定的bundle没有设置数据库连接池信息，则获得公共的默认配置的数据库连接对象。
	 * 
	 * @return
	 */
	public Connection getConnection() {

		synchronized (this) {

			if (this.connection == null) {
				this.connection = DatabaseManager.getInstance().getConnection(
						this.bundleSymbolicName);
			}
		}
		return this.connection;
	}

	/**
	 * 设置数据库连接对象
	 * 
	 * @param connection
	 */
	public void setConnection(Connection connection) {
		this.connection = connection;
	}

	/**
	 * 调用数据库连接对象的关闭方法
	 * @throws SQLException 
	 */
	public void close() throws SQLException {
		if (this.connection != null) {
			this.connection.close();		
			this.connection = null;
		}
	}

	/**
	 * 判断数据库代理是否拥有数据库连接对象
	 * 
	 * @return
	 */
	public boolean hasConnection() {

		if (this.connection != null) {
			return true;
		}
		return false;
	}
}
